Load code

Variables

Load data

Filter data

success

df_success <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET != 'full') %>%
  group_by(LEMMA) %>%
  mutate(DIFF_USES = USES - lag(USES)) %>%
  mutate(DIFF_USES_TOT = sum(DIFF_USES, na.rm=TRUE)) %>%
  filter(SUBSET == 'four') %>%
  arrange(DIFF_USES_TOT)

successful_diffs <- df_success %>%
  filter(DIFF_USES_TOT > 0) %>%
  pull(LEMMA)

unsuccessful_diffs <- df_success %>%
  filter(DIFF_USES_TOT < 0) %>%
  pull(LEMMA)

successful_uses_min <- df_comp %>%
  filter(USES > 1000) %>%
  pull(LEMMA)
  
  
unsuccessful_uses_min <- df_comp %>%
  filter(USES < 1000) %>%
  pull(LEMMA)

Single lemma

Load data

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Check uses and edges

df_comp %>%
  filter(LEMMA == 'hyperlocal') %>%
  select(LEMMA, USES_TOT, SUBSET, USES)

Case studies

Data overview

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Degree centralization

Diachronic

plt <- df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV, DENSITY) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% cases
    # LEMMA %in% c(cases, 'hyperlocal', 'blockchain', 'climate denial', 'man bun', 'upskill', 'deep learning')
    # overtourism: diff too big for case study scale; 
    # , 'broflake', 'climate crisis', 'incel', 'overtourism'
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=TRUE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

ggplotly(plt)

# ggsave('out/cases_cent_diac.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Full sample

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Edges

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full'
    # USES >= 2
    ) %>%
  arrange(
    (CENT_DEGREE)
    # desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt


# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% unsuccessful_diffs
    # USES_TOT >= 10000
    # USES > 1000
    ) %>%
  group_by(SUBSET) %>%
  summarize(
    DENS_AVG = mean(DENSITY),
    CENT_AVG = mean(CENT_DEGREE)
    ) %>%
  ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('degree centralization') +
    scale_x_discrete('subsets')


# ggsave('out/full_cent_diac.pdf', width=6, height=4)

Biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      ),
    USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE, default=CENT_DEGREE[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    CENT_LAST = CENT_DEGREE,
    EDGES_LAST = EDGES
    ) %>%
  arrange((CENT_DIFF))

Density

overall

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, DENSITY) %>%
  filter(SUBSET == 'four') %>%
  arrange(DENSITY)

over time

case studies

df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, DENSITY) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% c(cases, 'twitterer', 'robo-signing', 'covfefe', 'alt-left')
  ) %>%
  ggplot(., aes(x=SUBSET, y=DENSITY)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=TRUE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('density') +
    scale_x_discrete('subset')


# ggsave('out/cases_cent_diac.pdf', width=6, height=4)

full sample

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% unsuccessful_diffs,
    USES_TOT >= 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(
    DENS_AVG = mean(DENSITY)
    ) %>%
  ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('density') +
    scale_x_discrete('subsets')

biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, DENSITY, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      )
    # USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(DENS_DIFF = DENSITY - lag(DENSITY, default=DENSITY[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    DENS_LAST = DENSITY,
    EDGES_LAST = EDGES
    ) %>%
  arrange((DENS_DIFF))

Frequency vs. networks

Frequency vs. centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'four',
    # USES_TOT %in% (150000:500000)
    # LEMMA %in% c(cases)
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    # geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization'
      # trans='log'
      )

ggplotly(plt)

# ggsave('out/full_cent_freq_overall.pdf', width=6, height=4)
# ggsave('out/cases_cent_freq_overall.pdf', width=6, height=4)

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'four'
    ) %>%
  select(LEMMA, USES_TOT, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.3698, df = 509, p-value = 0.01817
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1894877 -0.0178851
sample estimates:
       cor 
-0.1044639 

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCgojIFZhcmlhYmxlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Vic2V0dGluZyA9ICd0aW1lJwpkaWZmX3N0YXJ0X21ldGhvZCA8LSAnZWRnZXMnCmRpZmZfc3RhcnRfbGltaXQgPC0gMwoKY2FzZXMgPC0gYygKICAndXBjeWNsaW5nJywKICAnYWx0LWxlZnQnLCAKICAnc29sb3ByZW5ldXInLAogICdoeXBlcmxvY2FsJwogICMgJ2dob3N0aW5nJywgCiAgIyAnbGl0dWF0aW9uJywgCiAgKQoKYGBgCgoKIyBMb2FkIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmlmIChleGlzdHMoJ2RmX2NvbXAnKSA9PSBGQUxTRSkgewogIGRmX2NvbXAgPC0gcmVhZF9kZl9jb21wKGZfcGF0aD0nb3V0L2RmX2NvbXAuY3N2JykKfQpgYGAKCgojIEZpbHRlciBkYXRhCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU8PiUgCiAgZmlsdGVyKAogICAgU0tJUCAhPSBUUlVFLAogICAgU1VCU0VUVElORyA9PSBzdWJzZXR0aW5nLAogICAgIyBlc3RhYmxpc2hlZCB3b3JkcwogICAgIUxFTU1BICVpbiUgYygnQW5nbG8tU2F4b24nLCAnY2xpbWF0ZSBjcmlzaXMnLCAnZ2xvYmFsIGhlYXRpbmcnLCAnZ3JlZW53YXNoaW5nJywgJ3BvbGl0aWNhbCBjb3JyZWN0bmVzcycsICdyZWZ1Z2VlIGNyaXNpcyAnKQogICAgIyBzdWNjZXNzZnVsIHdvcmRzOiBVU0VTX1RPVCA+PSAxMDAwMAogICAgIyB1bnN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UIDw9IDEwMDAwCiAgICAjIHdlaXJkIHdvcmRzOiBiaWcgZGljayBlbmVyZ3kKICApCmBgYAoKCiMjIHN1Y2Nlc3MKCmBgYHtyfQpkZl9zdWNjZXNzIDwtIGRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBmaWx0ZXIoU1VCU0VUICE9ICdmdWxsJykgJT4lCiAgZ3JvdXBfYnkoTEVNTUEpICU+JQogIG11dGF0ZShESUZGX1VTRVMgPSBVU0VTIC0gbGFnKFVTRVMpKSAlPiUKICBtdXRhdGUoRElGRl9VU0VTX1RPVCA9IHN1bShESUZGX1VTRVMsIG5hLnJtPVRSVUUpKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmb3VyJykgJT4lCiAgYXJyYW5nZShESUZGX1VTRVNfVE9UKQoKc3VjY2Vzc2Z1bF9kaWZmcyA8LSBkZl9zdWNjZXNzICU+JQogIGZpbHRlcihESUZGX1VTRVNfVE9UID4gMCkgJT4lCiAgcHVsbChMRU1NQSkKCnVuc3VjY2Vzc2Z1bF9kaWZmcyA8LSBkZl9zdWNjZXNzICU+JQogIGZpbHRlcihESUZGX1VTRVNfVE9UIDwgMCkgJT4lCiAgcHVsbChMRU1NQSkKCnN1Y2Nlc3NmdWxfdXNlc19taW4gPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoVVNFUyA+IDEwMDApICU+JQogIHB1bGwoTEVNTUEpCiAgCiAgCnVuc3VjY2Vzc2Z1bF91c2VzX21pbiA8LSBkZl9jb21wICU+JQogIGZpbHRlcihVU0VTIDwgMTAwMCkgJT4lCiAgcHVsbChMRU1NQSkKYGBgCgoKIyBTaW5nbGUgbGVtbWEKCiMjIExvYWQgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KY29ycHVzIDwtICcvVm9sdW1lcy9xamQvdHdpbnQvJwpsZW1tYSA8LSAnYmlnIGRpY2sgZW5lcmd5JwoKdHdlZXRzIDwtIGxvYWRfZGF0YShjb3JwdXMsIGxlbW1hKQp0d2VldHMgPC0gcG9zdHByb2ModHdlZXRzKQp0d2VldHMgPC0gZmlsdGVyX3R3ZWV0cyh0d2VldHMpCmBgYAoKCiMjIENoZWNrIHR3ZWV0cwoKYGBge3J9CnR3ZWV0cyAlPiUKICBzZWxlY3QodHdlZXQsIGRhdGUpICU+JQogICMgc2xpY2UoLiwgc2FtcGxlKDE6bigpKSkgI3JhbmRvbSBzZWxlY3Rpb24KICBhcnJhbmdlKGRhdGUpCmBgYAoKCiMjIENoZWNrIHVzZXMgYW5kIGVkZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoTEVNTUEgPT0gJ2h5cGVybG9jYWwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBTVUJTRVQsIFVTRVMpCmBgYAoKCiMgQ2FzZSBzdHVkaWVzCgojIyBEYXRhIG92ZXJ2aWV3CgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFUz1VU0VTX1RPVCwgU1BFQUtFUlM9VVNFUlNfVE9UKSAlPiUKICBtdXRhdGUoVVNFU19QRVJfU1BFQUtFUiA9IFVTRVMgLyBTUEVBS0VSUykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQogICMgZ2dwbG90KGRhdGE9LiwgYWVzKHg9VVNFUlNfVE9ULCB5PVVTRVNfVE9UKSkgKwogICMgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICMgICBzY2FsZV95X2NvbnRpbnVvdXMoJ2ZyZXF1ZW5jeSAobG9nKScsIHRyYW5zPSdsb2cnKQpgYGAKCgojIyBVc2FnZSBmcmVxdWVuY3kKCiMjIyBPdmVyYWxsIGFjcm9zcyBjYXNlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgIGFycmFuZ2UoZGVzYyhVU0VTX1RPVCkpCmBgYAoKCiMjIyBVc2VzIGluIGZpcnN0IHN1YnNldAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ29uZScKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgVVNFUykgJT4lCiAgYXJyYW5nZShVU0VTKQpgYGAKCgoKIyMgRGVncmVlIGNlbnRyYWxpemF0aW9uCgojIyMgRGlhY2hyb25pYwoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VUVElORywgU1VCU0VULCBDRU5UX0RFR1JFRSwgQ0VOVF9FViwgREVOU0lUWSkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICE9ICdmdWxsJywKICAgIExFTU1BICVpbiUgY2FzZXMKICAgICMgTEVNTUEgJWluJSBjKGNhc2VzLCAnaHlwZXJsb2NhbCcsICdibG9ja2NoYWluJywgJ2NsaW1hdGUgZGVuaWFsJywgJ21hbiBidW4nLCAndXBza2lsbCcsICdkZWVwIGxlYXJuaW5nJykKICAgICMgb3ZlcnRvdXJpc206IGRpZmYgdG9vIGJpZyBmb3IgY2FzZSBzdHVkeSBzY2FsZTsgCiAgICAjICwgJ2Jyb2ZsYWtlJywgJ2NsaW1hdGUgY3Jpc2lzJywgJ2luY2VsJywgJ292ZXJ0b3VyaXNtJwogICkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0RFR1JFRSkpICsgIyBncm91cD0xCiAgICBnZW9tX3BvaW50KGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIHNoYXBlPUxFTU1BKSkgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIGxpbmV0eXBlPUxFTU1BKSkgKwogICAgZ3VpZGVzKGdyb3VwPVRSVUUpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvY2FzZXNfY2VudF9kaWFjLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlcmFsbAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KAogICAgTEVNTUEsIAogICAgRURHRVMsCiAgICBDRU5UX0RFR1JFRSwgCiAgICBDRU5UX0VWCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkKYGBgCgoKIyBGdWxsIHNhbXBsZQoKIyMgVXNhZ2UgaW50ZW5zaXR5CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQpgYGAKCgojIyBFZGdlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ29uZScpICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBFREdFUykgJT4lCiAgYXJyYW5nZShFREdFUykKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkKCiMjIyBPdmVyYWxsCgojIyMjIExpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTX1RPVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICMgVVNFUyA+PSAyCiAgICApICU+JQogIGFycmFuZ2UoCiAgICAoQ0VOVF9ERUdSRUUpCiAgICAjIGRlc2MoQ0VOVF9FVikKICApCmBgYAoKCiMjIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PXJlb3JkZXIoTEVNTUEsIENFTlRfREVHUkVFKSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2Rpc2NyZXRlKCdsZW1tYXMnKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24gKGxvZyknLAogICAgICB0cmFucz0nbG9nJwogICAgICApCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9zeW5jX2FsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXIgdGltZQoKIyMjIyBBY3Jvc3MgYWxsIGxlbW1hcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJyksCiAgICBMRU1NQSAlaW4lIHVuc3VjY2Vzc2Z1bF9kaWZmcwogICAgIyBVU0VTX1RPVCA+PSAxMDAwMAogICAgIyBVU0VTID4gMTAwMAogICAgKSAlPiUKICBncm91cF9ieShTVUJTRVQpICU+JQogIHN1bW1hcml6ZSgKICAgIERFTlNfQVZHID0gbWVhbihERU5TSVRZKSwKICAgIENFTlRfQVZHID0gbWVhbihDRU5UX0RFR1JFRSkKICAgICkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1ERU5TX0FWRywgZ3JvdXA9MSkpICsKICAgIGdlb21fbGluZSgpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldHMnKQoKIyBnZ3NhdmUoJ291dC9mdWxsX2NlbnRfZGlhYy5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIyBCaWdnZXN0IGNoYW5nZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBDRU5UX0RFR1JFRSwgRURHRVMsIFVTRVNfVE9UKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgJWluJSBjKAogICAgICAnb25lJywgCiAgICAgICdmb3VyJwogICAgICApLAogICAgVVNFU19UT1QgPj0gMTAwMDAKICAgICkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KExFTU1BKSAlPiUKICBkcGx5cjo6bXV0YXRlKENFTlRfRElGRiA9IENFTlRfREVHUkVFIC0gbGFnKENFTlRfREVHUkVFLCBkZWZhdWx0PUNFTlRfREVHUkVFWzFdKSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIHNlbGVjdCgtU1VCU0VUKSAlPiUKICByZW5hbWUoCiAgICBDRU5UX0xBU1QgPSBDRU5UX0RFR1JFRSwKICAgIEVER0VTX0xBU1QgPSBFREdFUwogICAgKSAlPiUKICBhcnJhbmdlKChDRU5UX0RJRkYpKQpgYGAKCgojIERlbnNpdHkKCiMjIG92ZXJhbGwKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTX1RPVCwgQ0VOVF9ERUdSRUUsIERFTlNJVFkpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2ZvdXInKSAlPiUKICBhcnJhbmdlKERFTlNJVFkpCmBgYAoKCiMjIG92ZXIgdGltZQoKIyMjIGNhc2Ugc3R1ZGllcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVRUSU5HLCBTVUJTRVQsIENFTlRfREVHUkVFLCBERU5TSVRZKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgIT0gJ2Z1bGwnLAogICAgTEVNTUEgJWluJSBjKGNhc2VzLCAndHdpdHRlcmVyJywgJ3JvYm8tc2lnbmluZycsICdjb3ZmZWZlJykKICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9REVOU0lUWSkpICsgIyBncm91cD0xCiAgICBnZW9tX3BvaW50KGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIHNoYXBlPUxFTU1BKSkgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIGxpbmV0eXBlPUxFTU1BKSkgKwogICAgZ3VpZGVzKGdyb3VwPVRSVUUpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZW5zaXR5JykgKwogICAgc2NhbGVfeF9kaXNjcmV0ZSgnc3Vic2V0JykKCiMgZ2dzYXZlKCdvdXQvY2FzZXNfY2VudF9kaWFjLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgZnVsbCBzYW1wbGUKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgTEVNTUEgJWluJSB1bnN1Y2Nlc3NmdWxfZGlmZnMsCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBncm91cF9ieShTVUJTRVQpICU+JQogIHN1bW1hcml6ZSgKICAgIERFTlNfQVZHID0gbWVhbihERU5TSVRZKQogICAgKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PURFTlNfQVZHLCBncm91cD0xKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVuc2l0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldHMnKQpgYGAKCgojIyMgYmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIERFTlNJVFksIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKQogICAgIyBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoREVOU19ESUZGID0gREVOU0lUWSAtIGxhZyhERU5TSVRZLCBkZWZhdWx0PURFTlNJVFlbMV0pKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIERFTlNfTEFTVCA9IERFTlNJVFksCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoREVOU19ESUZGKSkKYGBgCgoKIyBGcmVxdWVuY3kgdnMuIG5ldHdvcmtzCgojIyBGcmVxdWVuY3kgdnMuIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZm91cicsCiAgICAjIFVTRVNfVE9UICVpbiUgKDE1MDAwMDo1MDAwMDApCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcykKICAgICMgIUxFTU1BICVpbiUgYygnc2x1dCBzaGFtaW5nJywgJ2Rhc2hjYW0nLCAnc2hhcmVhYmxlJywgJ2N1Y2tvbGQnLCAnZGVlcCBsZWFybmluZycsICdoeXBlcmxvY2FsJykKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgVVNFU19UT1QsIFVTRVMsIEVER0VTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgICMgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKIyBnZ3NhdmUoJ291dC9jYXNlc19jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIEJpZ2dlc3QgZGlzY3JlcGFuY2llcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ2ZvdXInCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoRElTQyA9IFVTRVNfVE9UIC8gQ0VOVF9ERUdSRUUpICU+JQogIGFycmFuZ2UoRElTQykKYGBgCgoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29yciA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkKICAKY29yLnRlc3QoZGZfY29yciRVU0VTLCBkZl9jb3JyJENFTlRfREVHUkVFKQpgYGAKCgojIENvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVNfVE9UID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMgUHJvY2Vzc2luZyBzdGF0dXMKCiMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFVTRVNfQUxMID0gc3VtKFVTRVNfVE9UKSwKICAgIFVTRVJTX0FMTCA9IHN1bShVU0VSU19UT1QpCiAgICApCmBgYA==